home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
tex
/
td187src.lzh
/
CSSPECIA.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
33KB
|
1,013 lines
IMPLEMENTATION MODULE CSspecial;
FROM BezierCurve IMPORT ComputeRealBezier;
FROM Dialoge IMPORT BusyStart, BusyEnd;
FROM Diverses IMPORT round, GetFSelText, NumAlert, min, max;
FROM FileIO IMPORT Fopen, EOF, AgainChar, Reset, Close, ReadChar,
ReadLn, AgainLine, Rewrite, WriteLn;
FROM ObjectUtilities IMPORT FillObject;
FROM Types IMPORT TextPosTyp, DrawObjectTyp,
LatexSpecials,
CodeAryTyp, ObjectPtrTyp;
FROM SYSTEM IMPORT BYTE, WORD, ADDRESS , ADR ;
FROM Storage IMPORT ALLOCATE , DEALLOCATE ;
IMPORT CommonData ;
IMPORT GetFile;
IMPORT MathLib0 ;
IMPORT MagicConvert ;
IMPORT MagicDOS ;
IMPORT MagicStrings ;
IMPORT MagicSys ;
IMPORT Variablen ;
IMPORT mtAlerts;
(**
IMPORT Debug;
IMPORT RTD;
**)
(**
VAR UseCSspecial : BOOLEAN;
**)
CONST CSBug = TRUE; (* Sobald Treiber Werte der unit mit Vorfaktoren *)
BugMsg = FALSE; (* erkennen auf FALSE setzen... (für cond.comp.) *)
TYPE chset = SET OF CHAR;
CONST Magic = -29564; (* Test auf ungültige Zahl *)
FMagic = -29564.0; (* Test auf ungültige Zahl *)
Integers = chset{'0'..'9','+','-'};
Reals = chset{'0'..'9','+','-','.'};
CS1Idlong = 'CS-Graphics V 1';
(*
CS2Idlong = 'CS-Graphics V 2';
*)
CSIdshort = 'CS-Graphics';
VAR FileHandle, oldlineval, oldthickval : INTEGER;
(* $D+*)
PROCEDURE OpenFile(REF FileName : ARRAY OF CHAR);
VAR Line, temp : ARRAY [0..29] OF CHAR;
BEGIN
Rewrite(FileHandle, FileName);
(*
IF CommonData.Usespecial = cstrunk2 THEN
WriteLn(FileHandle, CS2Idlong);
ELSE
WriteLn(FileHandle, CS1Idlong);
END;
*)
WriteLn(FileHandle, CS1Idlong);
WriteLn(FileHandle, "% Created by TeX-Draw by Jens Pirnay");
temp := "r";
WriteLn(FileHandle, temp); (* Reset *)
(*$? CSBug AND BugMsg:
WriteLn(FileHandle, "% Bug in Driver? Only pure units e.g. 1mm are recognized!"); (* Reset *)
*)
(*$? CSBug:
Line := 'u 1';
*)
(*$? NOT CSBug:
Line := 'u ';
Variablen.FactorToStr(temp);
MagicStrings.Append ( temp, Line);
*)
Variablen.UnitToStr(temp);
MagicStrings.Append ( temp, Line);
WriteLn(FileHandle, Line); (* Unitlength *)
oldlineval := 0;
oldthickval := 1; (* 0.4 pt *)
END OpenFile;
(* $D-*)
PROCEDURE Do1Line (x : INTEGER; VAR temp : ARRAY OF CHAR);
VAR i : INTEGER; found : INTEGER;
BEGIN
(*$? CSBug: Variablen.ValueToStr ( x , temp ) ; *)
(*$? NOT CSBug: Variablen.SimpleValueToStr ( x , temp ) ; *)
END Do1Line;
PROCEDURE DoLine(x1, y1, x2, y2 : INTEGER);
VAR line : ARRAY [0..255] OF CHAR;
temp : ARRAY [0..19] OF CHAR;
BEGIN
Do1Line(x1, line);
Do1Line(y1, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
MagicStrings.Append(' l ', line);
Do1Line(x2-x1, temp);
MagicStrings.Append(temp, line);
Do1Line(y2-y1, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
WriteLn(FileHandle, line);
END DoLine;
PROCEDURE DoBetterLine(x1, y1, x2, y2 : MagicSys.lINTEGER);
(* Werte sind das 10-fache des normalen *)
VAR line : ARRAY [0..255] OF CHAR;
temp : ARRAY [0..19] OF CHAR;
PROCEDURE Do10Line (x : MagicSys.lINTEGER; VAR temp : ARRAY OF CHAR);
VAR i : CARDINAL; found : BOOLEAN;
BEGIN
(*$? CSBug: Variablen.Value10ToStr ( x , temp ) ; *)
(*$? NOT CSBug: Variablen.SimpleValue10ToStr ( x , temp ) ; *)
(**
(* Aus 30.12 wird nun 3.012 *)
i := 0;
found := FALSE;
REPEAT
IF (temp[i] = '.') THEN
found := TRUE;
IF (i>0) THEN
temp[i ] := temp[i-1];
temp[i-1] := '.';
(* CS mag kein .3 sondern will 0.3 *)
IF (i-1 = 0) THEN
MagicStrings.Insert('0', temp, i-1);
ELSE
(* Keine Zahl ? Vorzeichen o.ä. ? *)
IF NOT ((temp[i-2]>='0') AND (temp[i-2]<='9')) THEN
MagicStrings.Insert('0', temp, i-1);
END;
END;
ELSE
MagicStrings.Insert('0', temp, 1);
END;
END;
INC(i);
UNTIL (i>=LENGTH(temp)) OR found;
IF NOT found THEN
(* Aus 30 wird 3.0 *)
i := LENGTH(temp);
temp[i+1] := 0C; (* um eins länger *)
temp[i ] := temp[i-1];
temp[i-1] := '.';
END;
**)
END Do10Line;
BEGIN
Do10Line(x1, line);
Do10Line(y1, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
Do10Line(x2-x1, temp);
MagicStrings.Append(' l ', line);
MagicStrings.Append(temp, line);
Do10Line(y2-y1, temp);
MagicStrings.Append(' ', line);
MagicStrings.Append(temp, line);
WriteLn(FileHandle, line);
END DoBetterLine;
PROCEDURE DoIt ( Object : ObjectPtrTyp;
dx, dy : INTEGER ) ;
CONST deltaangle = 3;
VAR txt : ARRAY [0..9] OF CHAR;
FirstX, FirstY, x, y, i : INTEGER;
startangle, endangle : INTEGER;
xradius, yradius : INTEGER;
CurrX, CurrY, OldX, OldY : MagicSys.lINTEGER;
x1, x2, x3, x4 : INTEGER;
px1, px2, px3, px4 : INTEGER;
y1, y2, y3, y4 : INTEGER;
py1, py2, py3, py4 : INTEGER;
PROCEDURE myentier ( x : LONGREAL ) : MagicSys.lINTEGER;
VAR result: MagicSys.lINTEGER;
BEGIN
result := INT(ABS(x) + 0.5);
IF x<0.0 THEN
RETURN -result;
ELSE
RETURN result;
END;
END myentier;
PROCEDURE WriteBezier(anzahl, x1, y1, x2, y2, x3, y3 : INTEGER);
CONST MaxBezPts = 1000;
VAR Number : ARRAY [0..19] OF CHAR;
BezierArray : ARRAY [0..2*MaxBezPts+1] OF LONGREAL;
i : INTEGER;
Line, temp : ARRAY [0..255] OF CHAR;
BEGIN
IF CommonData.Usespecial = cstrunk2 THEN
Do1Line(dx + x1, Line);
Do1Line(dy + y1, temp);
MagicStrings.Append(' ', Line);
MagicStrings.Append(temp, Line);
MagicStrings.Append(' b2 ', Line);
Do1Line(x2 - x1, temp);
MagicStrings.Append(temp, Line);
Do1Line(y2 - y1, temp);
MagicStrings.Append(' ', Line);
MagicStrings.Append(temp, Line);
Do1Line(x3 - x1, temp);
MagicStrings.Append(' ', Line);
MagicStrings.Append(temp, Line);
Do1Line(y3 - y1, temp);
MagicStrings.Append(' ', Line);
MagicStrings.Append(temp, Line);
WriteLn(FileHandle, Line);
ELSE
IF anzahl<=MaxBezPts THEN
i := anzahl;
ELSE
i := MaxBezPts;
END;
ComputeRealBezier(BezierArray, i, x1, y1, x2, y2, x3, y3);
OldX := myentier(10.0 * BezierArray[0]);
OldY := myentier(10.0 * BezierArray[1]);
FOR i:=1 TO anzahl DO
CurrX := myentier(10.0 * BezierArray[2*i ]);
CurrY := myentier(10.0 * BezierArray[2*i+1]);
DoBetterLine(10 * LONG(dx + Object^.Code[1]) + OldX,
10 * LONG(dy + Object^.Code[2]) + OldY,
10 * LONG(dx + Object^.Code[1]) + CurrX,
10 * LONG(dy + Object^.Code[2]) + CurrY);
OldX := CurrX;
OldY := CurrY;
END;
END;
END WriteBezier;
PROCEDURE MakeCircles1(Object : ObjectPtrTyp);
VAR startangle, endangle, xradius, yradius, i : INTEGER;
BEGIN
startangle := 0;
endangle := 360;
xradius := Object^.Code [3];
yradius := Object^.Code [3];
CASE VAL(DrawObjectTyp, Object^.Code [0]) OF
Arc :
startangle := Object^.Code [4];
endangle := startangle + Object^.Code [5]; |
Ellipse :
yradius := Object^.Code [4]; |
Oval :
CASE VAL(TextPosTyp, Object^.Code[4]) OF
LeftTop : startangle := 090; endangle := 180; |
Left : startangle := 090; endangle := 270; |
LeftBot : startangle := 180; endangle := 270; |
Top : startangle := 000; endangle := 180; |
Bottom : startangle := 180; endangle := 360; |
RightTop : startan